package com.qfmy.common.exception;


import com.qfmy.common.result.ResultCodeEnum;
import lombok.Data;
import org.jetbrains.annotations.NotNull;

/**
 * @author 清风明月
 * @Package com.qfmy.common.exception
 * @date 2025/11/11
 * @description 自定义异常处理
 */
@Data
@SuppressWarnings("all")
public class BaseException extends RuntimeException {

    /**
     * 业务错误码
     * 用于区分不同类型的业务异常（如参数错误、权限不足、资源不存在等），
     * 前端可根据该码进行差异化提示或逻辑处理（而非仅依赖错误信息文本）。
     */
    private Integer code;

    /**
     * 构造方法1：通过「具体错误码 + 错误信息」创建异常实例
     * 适用于：存在临时、特殊的业务异常场景（无对应 ResultCodeEnum 枚举映射时），
     * @param code    业务错误码（如 1001 代表参数校验失败，1002 代表权限不足等）
     * @param message 错误信息描述（如 "用户名不能为空"、"您无此操作权限"）
     */
    public BaseException(Integer code, String message) {
        // 调用父类 Exception 的构造方法，将错误信息传递给父类（便于通过 getMessage() 方法获取）
        super(message);
        // 为当前异常实例赋值业务错误码
        this.code = code;
    }

    /**
     * 构造方法2：通过「ResultCodeEnum 枚举」创建异常实例
     * 适用于：业务异常已在 ResultCodeEnum 中统一定义（推荐方式），
     * 避免硬编码错误码/信息，确保错误定义的全局一致性（如枚举中已定义 PARAM_ERROR(1001, "参数错误")）。
     * @param resultCodeEnum 包含错误码和错误信息的枚举实例（统一管理业务错误的枚举类）
     */
    public BaseException(@NotNull ResultCodeEnum resultCodeEnum) {
        // 从枚举中获取错误信息，传递给父类 Exception
        super(resultCodeEnum.getMessage());
        // 从枚举中获取错误码，赋值给当前异常实例
        this.code = resultCodeEnum.getCode();
    }

}
